{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "heading_collapsed": "false"
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import scanpy as sc\n",
    "import os\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from sklearn.metrics import silhouette_samples, silhouette_score\n",
    "\n",
    "import sys\n",
    "sys.path.append('~/SCALEX/script')\n",
    "from metrics import *\n",
    "plt.rc('font', family='Helvetica')\n",
    "plt.rcParams['pdf.fonttype'] = 42"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "palette = { 'SCALEX': (0.8392156862745098, 0.15294117647058825, 0.1568627450980392),\n",
    "            'Raw': (0.09019607843137255, 0.7450980392156863, 0.8117647058823529),\n",
    "            'Seurat_v3': (1.0, 0.4980392156862745, 0.054901960784313725),\n",
    "            'Harmony':  (0.12156862745098039, 0.4666666666666667, 0.7058823529411765),\n",
    "            'Conos':(0.4980392156862745, 0.4980392156862745, 0.4980392156862745),\n",
    "            'BBKNN': (0.5803921568627451, 0.403921568627451, 0.7411764705882353),\n",
    "            'Scanorama': (0.8901960784313725, 0.4666666666666667, 0.7607843137254902),\n",
    "            'FastMNN':  (0.17254901960784313, 0.6274509803921569, 0.17254901960784313),\n",
    "            'scVI': (0.5490196078431373, 0.33725490196078434, 0.29411764705882354),\n",
    "            'online_iNMF':(0.7372549019607844, 0.7411764705882353, 0.13333333333333333),\n",
    "            'LIGER':(0.6509803921568628, 0.807843137254902, 0.8901960784313725)}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "datasets =['pancreas', 'heart','liver','NSCLC','PBMC']\n",
    "methods = ['Raw', 'SCALEX','Seurat_v3','Harmony','Conos','BBKNN','scVI','Scanorama','FastMNN','online_iNMF','LIGER']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "heading_collapsed": "true",
    "tags": []
   },
   "source": [
    "### Silhouette_score & batch_entropy_mixing_score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "datasets = ['pancreas','heart','liver','NSCLC','PBMC']\n",
    "methods = ['Raw', 'SCALEX','Seurat_v3','Harmony','Conos','BBKNN','scVI','Scanorama','FastMNN','online_iNMF','LIGER']\n",
    "\n",
    "batch_score = pd.DataFrame(index = datasets, columns = methods)\n",
    "Silhouette_score = pd.DataFrame(index = datasets, columns = methods)\n",
    "\n",
    "for dataset in datasets:\n",
    "    print(dataset)\n",
    "    adata = sc.read_h5ad('/home/tiankang/SCALEX/results/{}/adata.h5ad'.format(dataset))\n",
    "    \n",
    "    batch_id = adata.obs['batch'].values.astype('object')\n",
    "    celltype = adata.obs['celltype'].values.astype('object').astype('str')\n",
    "    sample_size = 5000 if adata.shape[0] > 5000 else adata.shape[0]\n",
    "    for method in methods:\n",
    "        if method+'_umap' in list(adata.obsm.keys()):\n",
    "            feature = adata.obsm[method+'_umap']\n",
    "            feature[np.isnan(feature)] = 0\n",
    "            Silhouette_score.loc[dataset, method] = (silhouette_score(feature, celltype, sample_size=sample_size,random_state=1367))\n",
    "\n",
    "        else:\n",
    "            Silhouette_score.loc[dataset, method] = 0\n",
    "            pass\n",
    "    \n",
    "    df = pd.DataFrame(adata.obs.groupby('celltype')['batch'].nunique())\n",
    "    Celltypes = list(df[df['batch'] >1].index)\n",
    "    batch_score1 = []\n",
    "    for Celltype in Celltypes:\n",
    "        adata_ = adata[adata.obs.celltype == Celltype]\n",
    "\n",
    "        batch_id = adata_.obs['batch'].values.astype('object').astype('str')\n",
    "        celltype = adata_.obs['celltype'].values.astype('object').astype('str')\n",
    "        \n",
    "        n_neighbors = 30 if adata_.shape[0] > 30 else adata_.shape[0]\n",
    "        n_samples_per_pool = 30 if adata_.shape[0] > 30 else adata_.shape[0]\n",
    "\n",
    "        batch_score2 = []\n",
    "        for method in methods: \n",
    "            if method+'_umap' in adata_.obsm.keys():\n",
    "                feature = adata_.obsm[method+'_umap']\n",
    "                feature[np.isnan(feature)] = 0\n",
    "                    \n",
    "                batch_score2.append(batch_entropy_mixing_score(feature,\n",
    "                                                               batch_id,\n",
    "                                                               n_neighbors = n_neighbors,\n",
    "                                                               n_pools=10, \n",
    "                                                               n_samples_per_pool=n_samples_per_pool\n",
    "                                                               )*adata_.shape[0])\n",
    "            else:\n",
    "                batch_score2.append(0)\n",
    "                pass\n",
    "        \n",
    "        batch_score1.append(batch_score2)\n",
    "    total = adata[adata.obs.celltype.isin(Celltypes)].shape[0]\n",
    "    correct = [item/total for item in np.sum(batch_score1, axis=0)]\n",
    "\n",
    "    batch_score.loc[dataset, :] = correct"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "score = pd.DataFrame({' Dataset':np.repeat(datasets, len(methods)),\n",
    "                       'Method': methods * len(datasets),\n",
    "                       'Silhouette_score': np.reshape(Silhouette_score.values, (1, -1)).squeeze(),\n",
    "                       'Batch_mixing_score': np.reshape(batch_score.values, (1, -1)).squeeze(),})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "heading_collapsed": "false"
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No handles with labels found to put in legend.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1500x230 with 5 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.rc('font', family='Helvetica')\n",
    "plt.rcParams['pdf.fonttype'] = 42\n",
    "\n",
    "from matplotlib import gridspec\n",
    "figsize=(15,2.3)\n",
    "fig = plt.figure(figsize=figsize)\n",
    "plt.rcParams['savefig.dpi'] = 100\n",
    "plt.rcParams['figure.dpi'] = 100\n",
    "legend_params_ = {'loc': 'center left',\n",
    "                  'bbox_to_anchor':(1.05, 0.45),\n",
    "                  'fontsize': 12,\n",
    "                  'ncol': 1,\n",
    "                  'frameon': False,\n",
    "                  'markerscale': 1.2,\n",
    "                 }\n",
    "axs = gridspec.GridSpec(nrows=1, ncols=5, height_ratios=None, width_ratios=[1]*5, wspace=0.2, hspace=0)\n",
    "\n",
    "for i, data in enumerate(datasets):\n",
    "    ax = fig.add_subplot(axs[0, i])\n",
    "    if i == 4:\n",
    "        ax = sns.scatterplot(x=\"Batch_mixing_score\", \n",
    "                             y=\"Silhouette_score\", \n",
    "                             data=score.loc[score.Dataset == data,:],\n",
    "                             hue='Method',\n",
    "                             palette=palette,\n",
    "                             legend=False,\n",
    "                             marker='+',\n",
    "                             s=100)\n",
    "        \n",
    "        plt.legend(**legend_params_)\n",
    "    else:\n",
    "        ax = sns.scatterplot(x=\"Batch_mixing_score\", \n",
    "                             y=\"Silhouette_score\", \n",
    "                             data=score.loc[score.Dataset == data,:],\n",
    "                             hue='Method',\n",
    "                             palette=palette, \n",
    "                             legend=False,\n",
    "                             marker=\"+\",\n",
    "                             s=100)\n",
    "        \n",
    "    if i == 1:    \n",
    "        plt.ylim(0,0.7)\n",
    "    else:\n",
    "        ax.set_yticks([0,0.2,0.4,0.6])\n",
    "    ax.set_title(data, fontsize=15, va='center',pad=10)\n",
    "    ax.tick_params(axis='y',left=True, right=False, labelright=False, labelleft=True, labelsize=12, length=3, pad=1)\n",
    "\n",
    "\n",
    "    if i == 0:\n",
    "        ax.set_ylabel('Silhouette Score', rotation=90, fontsize=16, labelpad=10, va='center')\n",
    "    else:\n",
    "        ax.set_ylabel('')\n",
    "\n",
    "    ax.set_xlabel('', fontsize=15, labelpad=10, va='center')\n",
    "    ax.tick_params(axis='x', bottom=True, top=False, labeltop=False, labelbottom=True, labelsize=12, length=3, pad=3, labelrotation=0)\n",
    "fig.text(0.5, -0.1, 'Batch Entropy Mixing Score', ha='center',size=16)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
